package com.xzy.sms.core.adapter.impl.gz;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.namespace.QName;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.xzy.sms.core.adapter.SendSmsAdapter;
import com.xzy.sms.core.adapter.impl.gz.service.ArrayOfString;
import com.xzy.sms.core.adapter.impl.gz.service.SvSndSmsService;
import com.xzy.sms.core.adapter.impl.gz.service.SvSndSmsServicePortType;
import com.xzy.sms.core.entity.SendContext;
import com.xzy.sms.exception.SendSmsException;
import com.xzy.sms.web.domain.entity.ChannelConfig;

/**
 * @desc 
 * @author wjw
 * @time 2017年11月16日下午3:29:15
 */
public class GuizouSendSmsAdapter implements SendSmsAdapter {
    
    /** FIXME */
    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
    
    /** 命名空间 */
    private static final String NS = "http://service.sv.psmis.sunrise.com";
    
    /** 服务名 */
    private static final String SERVICE_NAME = "SvSndSmsService";
    
    @Override
    public void sendSms(SendContext sms) throws SendSmsException {
        ChannelConfig config = sms.getChannelConfig();
        // 服务器信息：
        String url = config.getUrl();
        URL wsdl_url = null;
        QName service_name = null;
        try {
            wsdl_url = new URL(url);
            service_name = new QName(NS, SERVICE_NAME);
        } catch (MalformedURLException e) {
            throw new SendSmsException("在解析webservice的WSDL地址时异常，请检查配置", e);
        }
        
        if (StringUtils.isBlank(config.getParameter("port"))) {
            throw new SendSmsException("短信网关缺少端口配置，请检查配置");
        }
        
        // 发送器：
        SvSndSmsServicePortType sspt = new SvSndSmsService(wsdl_url, service_name).getSvSndSmsServiceHttpPort();
        
        // 客户端信息：
        ArrayOfString arr = new ArrayOfString();
        arr.getString().add(0, config.getAccount());
        arr.getString().add(1, config.getPassword());
        arr.getString().add(2, config.getParameter("port")); // 发送端口号
        arr.getString().add(3, "1"); // 表示批量发送
        arr.getString().add(4, "1"); // 条数
        
        // 接收号码、短信内容数组
        ArrayOfString recv_tels = new ArrayOfString();
        ArrayOfString recv_content = new ArrayOfString();
        recv_tels.getString().add(0, sms.getMobile());
        recv_content.getString().add(0, sms.getSendContent());
        
        /**
         * @param params [] params[0]用户名 params[1]密码 params[2]端口号 params[3]发送类型(0.群发；1.批量发送) params[4]要发送的短信条数
         * @param tels [] 要发送的电话号码
         * @param msgs [] 要发送的短信内容
         * @return [60.参数错误] [20.无权限] [40.端口号错误] [30.超过最大发送条数] [10.发送成功] [00.发送失败]
         */
        try {
            String result = sspt.sndMsg(arr, recv_tels, recv_content);
            logger.info("短信发送结果为:" + result + "," + sms.toString());
            if (!StringUtils.startsWith(result, "10")) {
                throw new SendSmsException("短信网关返回意外的结果 : " + result);
            }
        } catch (Exception e) {
            logger.error("短信发送失败 " + sms.toString(), e);
            throw new SendSmsException(e);
        }
    }
    
}
